<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="https://www.w3.org/1999/xhtml" lang="zh-CN" xml:lang="zh-CN">
<head><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
    <title>7.3. 启动脚本是如何工作的?</title>
    <link rel="stylesheet" href="../stylesheets/lfs.css" type="text/css" />
    <link rel="stylesheet" href="../stylesheets/lfs-print.css" type="text/css" media="print" />
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head>
  <body id="lfs" class="6.2">
    <div class="navheader">
      <div class="headertitles">
        <h4>Linux From Scratch - 版本 6.2</h4>
        <h3>第七章 配置系统启动脚本</h3>
      </div>
      <ul class="headerlinks">
        <li class="prev">
          <a accesskey="p" href="bootscripts.html" title="LFS-Bootscripts-6.2">后退</a>
          <p>LFS-Bootscripts-6.2</p>
        </li>
        <li class="next">
          <a accesskey="n" href="udev.html" title="LFS 系统的设备和模块处理">前进</a>
          <p>LFS 系统的设备和模块处理</p>
        </li>
        <li class="up"><a accesskey="u" href="chapter07.html" title="第七章 配置系统启动脚本">上一级</a></li>
        <li class="home"><a accesskey="h" href="../index.html" title="Linux From Scratch - 版本 6.2">首页</a></li>
      </ul>
    </div>
    <div class="sect1">
      <div class="titlepage">
        <h1 class="sect1">7.3. 启动脚本是如何工作的?</h1>
      </div>
      <p>Linux 使用的是基于 <span class="emphasis"><em>运行级(run-levels)</em></span> 概念的称为 SysVinit 的专用启动工具。它在不同的系统上可能是完全不一样的，所以不能认为一个脚本在某个 Linux 发行版上工作正常，于是在 LFS 中也会正常工作。LFS 有自己的一套规则，当然，LFS 也遵守一些公认的标准。
      </p>
      <p>SysVinit(从现在开始我们称之为"<span class="quote">init</span>")以运行级的模式来工作，一般有 7 个运行级(从 0 到 6，实际上可以有更多的运行级，但都是用于特殊情况而且一般使用不到。 参见 <tt class="filename">init(8)</tt> 以获得更多信息)，每个运行级对应于一套设定好的任务，当启动一个运行级的时候，计算机就需要执行相应的任务。默认的运行级是 3，下面是对不同运行级的描述：
      </p>
      <div class="literallayout">
        <p>
          0: 停止计算机<br />
          1: 单用户模式<br />
          2: 无网络多用户模式<br />
          3: 有网络多用户模式<br />
          4: 保留作自定义，否则同运行级 3<br />
          5: 同运行级 4，一般用于图形界面(GUI)登录(如 X 的 <span>
          <strong class="command">xdm</strong></span> 或者 KDE 的 <span><strong class="command">kdm</strong></span>)<br />
          6: 重新启动计算机
        </p>
      </div>
      <p>用来改变运行级的命令是 <span><strong class="command">init <em class="replaceable"><tt>[runlevel]</tt></em></strong></span> ，这里的 <em class="replaceable"><tt>[runlevel]</tt></em> 是目标运行级。例如，要重启计算机，用户可以运行 <span><strong class="command">init 6</strong></span> 命令，<span><strong class="command">reboot</strong></span> 其实只是这个命令的别名，同样，<span><strong class="command">halt</strong></span> 命令也只是 <span><strong class="command">init 0</strong></span> 的别名。
      </p>
      <p>在 <tt class="filename">/etc/rc.d</tt> 目录下有一些类似于 <tt class="filename">rc?.d</tt> 的目录(这里 ? 是运行级的数字)以及 <tt class="filename">rcsysinit.d</tt> ，里面都包含许多符号链接，其中一些以 <span class="emphasis"><em>K</em></span> 字母开头，另外一些以 <span class="emphasis"><em>S</em></span> 字母开头，这些链接名在首字母后面都跟着两个数字。K 字母的含义是停止(杀死)一个服务，S 字母的含义是启动一个服务。而数字则确定这些脚本的启动顺序，从 00 到 99(数字越小执行的越早)。当 <span><strong class="command">init</strong></span> 转换到其它运行级时，一些相应的服务会停止，而另一些服务则会启动。
      </p>
      <p>真正的脚本则在 <tt class="filename">/etc/rc.d/init.d</tt> 目录下，它们完成实际工作，符号链接都是指向它们的。停止脚本的链接和启动脚本的链接都指向 <tt class="filename">/etc/rc.d/init.d</tt> 目录下同一个脚本，这是因为调用这些脚本时可以使用不同的参数，例如 <em class="parameter"><tt>start</tt></em>, <em class="parameter"><tt>stop</tt></em>, <em class="parameter"><tt>restart</tt></em>, <em class="parameter"><tt>reload</tt></em>, <em class="parameter"><tt>status</tt></em> 当调用 K 链接时，相应的脚本用 <em class="parameter"><tt>stop</tt></em> 参数运行；当调用 S 链接时，相应的脚本用 <em class="parameter"><tt>start</tt></em> 参数运行。
      </p>
      <p>上面的说明有一个例外，在 <tt class="filename">rc0.d</tt> 和 <tt class="filename">rc6.d</tt> 目录下以 <span class="emphasis"><em>S</em></span> 开头的链接不会启动任何东西，而是用 <em class="parameter"><tt>stop</tt></em> 参数调用，来停止某些服务。这背后的逻辑是，当用户要重启或关闭系统的时候，不会要启动什么服务，只会要系统停止。
      </p>
      <p>以下是脚本参数的描述：
      </p>
      <div class="variablelist">
        <dl>
          <dt>
            <span class="term"><em class="parameter"><tt>start</tt></em></span>
          </dt>
          <dd>
            <p>
              启动服务
            </p>
          </dd>
          <dt>
            <span class="term"><em class="parameter"><tt>stop</tt></em></span>
          </dt>
          <dd>
            <p>
              停止服务
            </p>
          </dd>
          <dt>
            <span class="term"><em class="parameter"><tt>restart</tt></em></span>
          </dt>
          <dd>
            <p>
              停止服务，然后再启动
            </p>
          </dd>
          <dt>
            <span class="term"><em class="parameter"><tt>reload</tt></em></span>
          </dt>
          <dd>
            <p>该服务的配置已更新。如果修改了某个服务的配置文件，又不必重启这个服务的时候，可以使用这个参数。
            </p>
          </dd>
          <dt>
            <span class="term"><em class="parameter"><tt>status</tt></em></span>
          </dt>
          <dd>
            <p>显示服务的状态，如果服务正在运行，会显示该服务进程的 PID 。
            </p>
          </dd>
        </dl>
      </div>
      <p>您可以自由修改启动进程工作的方式(毕竟这是您自己的 LFS 系统)，我们这里给出的文件只是它们怎样工作的一个示例而已。</p>
    </div>
    <div class="navfooter">
      <ul>
        <li class="prev">
          <a accesskey="p" href="bootscripts.html" title="LFS-Bootscripts-6.2">后退</a>
          <p>LFS-Bootscripts-6.2</p>
        </li>
        <li class="next">
          <a accesskey="n" href="udev.html" title="LFS 系统的设备和模块处理">前进</a>
          <p>LFS 系统的设备和模块处理</p>
        </li>
        <li class="up"><a accesskey="u" href="chapter07.html" title="第七章 配置系统启动脚本">上一级</a></li>
        <li class="home"><a accesskey="h" href="../index.html" title="Linux From Scratch - 版本 6.2">首页</a>.
        </li>
      </ul>
    </div>
</body></html>
